/*
 * Copyright 2002-2010 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.beans.factory.support;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;

/**
 * 具体执行流程
 * 在 Spring 应用上下文刷新的过程中，当处理 BeanDefinitionRegistryPostProcessor 类型的 Bean 时，
 * Spring 会先调用 postProcessBeanDefinitionRegistry 方法。这使得你可以在任何常规的 BeanFactoryPostProcessor 被调用之前注册额外的 Bean 或修改现有的 Bean 定义。接着，Spring 会继续初始化过程，并调用 postProcessBeanFactory 方法，
 * 这一步骤与普通的 BeanFactoryPostProcessor 的行为相同。
 *
 * 使用场景
 * postProcessBeanDefinitionRegistry：如果你需要在其他 Bean 定义被处理之前向应用上下文中添加或修改 Bean 定义，你应该使用这个方法。例如，你可以在这里注册新的 Bean 定义、导入配置类或者处理条件注解等。
 * postProcessBeanFactory：如果你需要对已经存在的 Bean 定义进行进一步的操作（如修改属性值），但不需要注册新的 Bean 定义，则可以在这个方法中完成这些工作。此外，这也是修改 Bean 工厂配置的地方。
 * 注意事项
 * 由于 postProcessBeanDefinitionRegistry 在 postProcessBeanFactory 之前执行，确保在这两个方法之间的逻辑不会相互冲突非常重要。特别是当你在这两个阶段都对相同的 Bean 定义进行修改时，要特别小心以避免意外的行为。
 *
 * <br>
 * Extension to the standard {@link BeanFactoryPostProcessor} SPI, allowing for
 * the registration of further bean definitions <i>before</i> regular
 * BeanFactoryPostProcessor detection kicks in. In particular,
 * BeanDefinitionRegistryPostProcessor may register further bean definitions
 * which in turn define BeanFactoryPostProcessor instances.
 * <br> 扩展 BeanFactoryPostProcessor SPI，允许在常规 BeanFactoryPostProcessor 检测之前注册更多的 bean 定义。
 * 特别是，BeanDefinitionRegistryPostProcessor 可以注册更多的bean 定义，这些 bean 定义又定义了 BeanFactoryPostProcessor 实例。
 *
 * <br> BeanFactoryPostProcessor 的扩展。允许注册更多的 bean 定义，以便在常规的 BeanFactoryPostProcessor 检测之前。
 *
 * @author Juergen Hoeller
 * @since 3.0.1
 * @see org.springframework.context.annotation.ConfigurationClassPostProcessor
 */
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {

	/**
	 * Modify the application context's internal bean definition registry after its
	 * standard initialization. All regular bean definitions will have been loaded,
	 * but no beans will have been instantiated yet. This allows for adding further
	 * bean definitions before the next post-processing phase kicks in.
	 * <br>修改应用程序上下文内部 bean 定义注册表的标准化初始化后。所有常规的 bean 定义都将被加载，但还没有实例化任何 bean。
	 * 这允许在下一个后处理阶段之前添加更多的 bean 定义。
	 * @param registry the bean definition registry used by the application context
	 * @throws org.springframework.beans.BeansException in case of errors
	 */
	void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;

}
